﻿------------------------------------------------------------------------------------------------------------------------------
----------------------------------------pca_guias.motivos_guia_remision_remitente---------------------------------------------
------------------------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_guias.fn_get_list_motivos_guia_remision_remitente()RETURNS SETOF pca_guias.motivos_guia_remision_remitente AS
$$
DECLARE
	_row  pca_guias.motivos_guia_remision_remitente%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			nombre
		FROM
			 pca_guias.motivos_guia_remision_remitente
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------pca_guias.guias_remision_remitente------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_guias.fn_existe_guia_remision_remitente(varchar,--oficina_id $1
								        varchar,--empresa_id $2
								        integer,--serie $3
								        integer --numero $4
									)RETURNS boolean AS
$$
DECLARE
	_guia_remision_remitente_id bigint;
BEGIN
	SELECT 
		guia_remision_remitente_id 
	INTO
		_guia_remision_remitente_id
	FROM 
		pca_guias.guias_remision_remitente
	WHERE 
		oficina_id = $1 AND
		empresa_id = $2 AND
		serie = $3 AND
		numero = $4 AND 
		estado_guia_id <> '00' AND
		estado_guia_id <> '02';

	IF(FOUND)THEN
		RETURN true;
	ELSE
		RETURN false;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_guias.fn_add_borrador_guia_remision_remitente(bigint,--sesion_id $1
									      varchar,--oficina_id $2
									      varchar --empresa_id $3
									      )RETURNS bigint AS
$$
DECLARE
	_precios_incluyen_igv pca_guias.guias_remision_remitente.precios_incluyen_igv%TYPE;
	_val_igv pca_guias.guias_remision_remitente.val_igv%TYPE;
	_moneda_id pca_guias.guias_remision_remitente.moneda_id%TYPE;
	_tipo_cambio_emision pca_guias.guias_remision_remitente.tipo_cambio_emision%TYPE;
	_imprimir_precios pca_guias.guias_remision_remitente.imprimir_precios%TYPE;
BEGIN
	_precios_incluyen_igv := pca.fn_get_precios_inc_igv($2,$3);
	_val_igv := pca.fn_get_val_igv($2,$3);
	_moneda_id := pca.fn_get_moneda_default($2,$3);
	_tipo_cambio_emision := pca.fn_get_tipo_cambio_ventas($2,$3);
	_imprimir_precios := pca.fn_get_imprimir_precios_guia_remision_remitente($2,$3);
	
	INSERT INTO pca_guias.guias_remision_remitente
		(sesion_id,
		oficina_id,
		empresa_id,
		serie,
		numero,
		comprobante_id,
		fecha_traslado,
		fecha_hora_sistema,
		num_doc_identidad_destinatario,
		nombre_destinatario,
		punto_partida,
		punto_llegada,
		motivo_traslado,
		num_doc_identidad_transportista,
		nombre_transportista,
		marca_placa,
		licencia_conducir,
		estado_guia_id,
		precios_incluyen_igv,
		val_igv,
		moneda_id,
		tipo_cambio_emision,
		imprimir_precios)
	VALUES
		($1,$2,$3,0,0,null,current_timestamp,current_timestamp,'','','','','','','','','','00',_precios_incluyen_igv,_val_igv,_moneda_id,_tipo_cambio_emision,_imprimir_precios);

	RETURN pca_global.fn_pseudo_encrypt_bigint(currval('pca_guias.seq_guia_remision_remitente_id')::integer);
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_guias.fn_add_guia_remision_remitente(bigint,--sesion_id $1
								    varchar,--oficina_id $2
								    varchar,--empresa_id $3
								    integer,--serie $4
								    integer,--numero $5
								    bigint,--comprobante_id $6
								    timestamp with time zone,--fecha_traslado $7
								    varchar,--num_doc_identidad_destinatario $8
								    varchar,--nombre_destinatario $9
								    varchar,--punto_partida $10
								    varchar,--punto_llegada $11
								    varchar,--motivo_traslado $12
								    varchar,--num_doc_identidad_transportista $13
								    varchar,--nombre_transportista $14
								    varchar,--marca_placa $15
								    varchar,--licencia_conducir $16
								    varchar,--estado_guia_id $17
								    boolean,--precios_incluyen_igv $18
								    numeric,--val_igv $19
								    varchar,--moneda_id $20
								    numeric,--importe_bruto $21
								    numeric,--descuento $22
								    numeric,--valor_venta $23
								    numeric,--impuesto $24
								    numeric,--precio_venta $25
								    numeric,--tipo_cambio_emision $26
								    text,--observaciones $27
								    boolean --imprimir_precios $28
								    )RETURNS bigint AS
$$
BEGIN
	INSERT INTO pca_guias.guias_remision_remitente
		(sesion_id,
		 oficina_id,
		 empresa_id,
		 serie,
		 numero,
		 comprobante_id,
		 fecha_traslado,
		 num_doc_identidad_destinatario,
		 nombre_destinatario,
		 punto_partida,
		 punto_llegada,
		 motivo_traslado,
		 num_doc_identidad_transportista,
		 nombre_transportista,
		 marca_placa,
		 licencia_conducir,
		 estado_guia_id,
		 precios_incluyen_igv,
		 val_igv,
		 moneda_id,
		 importe_bruto,
		 descuento,
		 valor_venta,
		 impuesto,
		 precio_venta,
		 tipo_cambio_emision,
		 observaciones,
		 imprimir_precios)
	VALUES
		($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28);

	RETURN pca_global.fn_pseudo_encrypt_bigint(currval('pca_guias.seq_guia_remision_remitente_id')::integer);
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_guias.fn_update_guia_remision_remitente(bigint,--guia_remision_remitente_id $1
									bigint,--sesion_id $2
								        varchar,--oficina_id $3
								        varchar,--empresa_id $4
									integer,--serie $5
									integer,--numero $6
									bigint,--comprobante_id $7
									timestamp with time zone,--fecha_traslado $8
									varchar,--num_doc_identidad_destinatario $9
									varchar,--nombre_destinatario $10
									varchar,--punto_partida $11
									varchar,--punto_llegada $12
									varchar,--motivo_traslado $13
									varchar,--num_doc_identidad_transportista $14
									varchar,--nombre_transportista $15
									varchar,--marca_placa $16
									varchar,--licencia_conducir $17
									varchar,--moneda_id $18
									numeric,--tipo_cambio_emision $19
									text,--observaciones $20
									boolean --imprimir_precios $21
									)RETURNS void AS
$$
BEGIN
	UPDATE pca_guias.guias_remision_remitente SET
		sesion_id = $2,
		oficina_id = $3,
		empresa_id = $4,
		serie = $5,
		numero = $6,
		comprobante_id = $7,
		fecha_traslado = $8,
		num_doc_identidad_destinatario = $9,
		nombre_destinatario = $10,
		punto_partida = $11,
		punto_llegada = $12,
		motivo_traslado = $13,
		num_doc_identidad_transportista = $14,
		nombre_transportista = $15,
		marca_placa = $16,
		licencia_conducir = $17,
		moneda_id = $18,
		tipo_cambio_emision = $19,
		observaciones = $20,
		imprimir_precios = $21
	WHERE
		guia_remision_remitente_id = $1;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_guias.fn_update_precios_incluyen_igv_guia_remision_remitente(bigint, --guias_remision_remitente $1
											    boolean --precios_incluyen_igv $2
											    )RETURNS void AS
$$
DECLARE
	_row pca_guias.guias_remision_remitente%ROWTYPE;
	_importe_bruto pca_guias.guias_remision_remitente.importe_bruto%TYPE;
	_descuento pca_guias.guias_remision_remitente.descuento%TYPE;
	_valor_venta pca_guias.guias_remision_remitente.valor_venta%TYPE;
	_impuesto pca_guias.guias_remision_remitente.impuesto%TYPE;
	_precio_venta pca_guias.guias_remision_remitente.precio_venta%TYPE;
BEGIN
	SELECT
		*
	INTO
		_row
	FROM
		pca_guias.guias_remision_remitente
	WHERE
		guia_remision_remitente_id = $1;

	_descuento := _row.descuento;
	_importe_bruto := _row.importe_bruto;

	IF(FOUND)THEN
		IF(_row.precios_incluyen_igv <> $2)THEN --Actualizar solo si el nuevo valor es diferente
			IF($2)THEN --si incluyen IGV
				_precio_venta := _importe_bruto - _descuento;
				_valor_venta := _precio_venta / (1+ (_row.val_igv/100));
			ELSE --no incluyen IGV
				_valor_venta := _importe_bruto - _descuento;
				_precio_venta := _valor_venta * (1+ (_row.val_igv/100));
			END IF;

			_impuesto :=  _precio_venta - _valor_venta;

			UPDATE pca_guias.guias_remision_remitente SET
				precios_incluyen_igv = $2,
				valor_venta = _valor_venta,
				impuesto = _impuesto,
				precio_venta = _precio_venta
			WHERE
				guia_remision_remitente_id = $1;
		END IF;
	ELSE
		RAISE EXCEPTION 'No existe guia remision remitente con ID = %',$1;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_guias.fn_del_guia_remision_remitente(bigint --guia_remision_remitente_id $1
								     )RETURNS void AS
$$
BEGIN
	DELETE FROM pca_guias.guias_remision_remitente WHERE guia_remision_remitente_id = $1;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_guias.fn_descartar_borradores_guia_remision_remitente(ids bigint[]
										      )RETURNS void AS
$$
DECLARE
	i integer; --puntero para recorrer los IDS
	numregistros integer;
BEGIN
	numregistros := array_upper(ids,1);
	i := 1;

	WHILE i <= numregistros 
	LOOP
		DELETE FROM pca_guias.guias_remision_remitente WHERE guia_remision_remitente_id = ids[i] AND estado_guia_id = '00';
		i = i + 1;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_guias.fn_eliminar_papelera_guia_remision_remitente(ids bigint[]
										  )RETURNS void AS
$$
DECLARE
	i integer; --puntero para recorrer los IDS
	numregistros integer;
BEGIN
	numregistros := array_upper(ids,1);
	i := 1;

	WHILE i <= numregistros 
	LOOP
		DELETE FROM pca_guias.guias_remision_remitente WHERE guia_remision_remitente_id = ids[i] AND estado_guia_id = '02';
		i = i + 1;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_guias.fn_update_estado_guia_remision_remitente(bigint,--guia_remision_remitente_id $1
									       varchar --estado_guia_id $2
									       )RETURNS void AS
$$
BEGIN
	UPDATE pca_guias.guias_remision_remitente SET
		estado_guia_id = $2
	WHERE
		guia_remision_remitente_id = $1;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_guias.fn_get_guia_remision_remitente(bigint --guia_remision_remitente_id $1
								    )RETURNS SETOF pca_guias.vw_guias_remision_remitente AS
$$
DECLARE
	_row pca_guias.vw_guias_remision_remitente%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			guia_remision_remitente_id,
			sesion_id,
			usuario_id,
			oficina_id,
			empresa_id,
			serie,
			numero,
			strserienumero,
			comprobante_id,
			fecha_traslado,
			fecha_hora_sistema,
			num_doc_identidad_destinatario,
			nombre_destinatario,
			punto_partida,
			punto_llegada,
			motivo_traslado,
			num_doc_identidad_transportista,
			nombre_transportista,
			marca_placa,
			licencia_conducir,
			estado_guia_id,
			precios_incluyen_igv,
			val_igv,
			moneda_id,
			moneda,
			moneda_siglas,
			importe_bruto,
			descuento,
			valor_venta,
			impuesto,
			precio_venta,
			tipo_cambio_emision,
			observaciones,
			imprimir_precios
		FROM
			pca_guias.vw_guias_remision_remitente
		WHERE
			guia_remision_remitente_id = $1
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

----------------------------------Consultar Borradores---------------------------------------------

CREATE OR REPLACE FUNCTION pca_guias.fn_get_list_guia_remision_remitente_borrador(integer,--start $1
										  integer,--limit $2
										  varchar,--oficina_id $3
										  varchar,--empresa_id $4
										  varchar --usuario_id $5
										  )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			guia_remision_remitente_id,
			sesion_id,
			usuario_id,
			oficina_id,
			empresa_id,
			serie,
			numero,
			strserienumero,
			comprobante_id,
			fecha_traslado,
			fecha_hora_sistema,
			num_doc_identidad_destinatario,
			nombre_destinatario,
			punto_partida,
			punto_llegada,
			motivo_traslado,
			num_doc_identidad_transportista,
			nombre_transportista,
			marca_placa,
			licencia_conducir,
			estado_guia_id,
			precios_incluyen_igv,
			val_igv,
			moneda_id,
			moneda,
			moneda_siglas,
			importe_bruto,
			descuento,
			valor_venta,
			impuesto,
			precio_venta,
			tipo_cambio_emision,
			observaciones,
			imprimir_precios
		FROM
			pca_guias.vw_guias_remision_remitente
		WHERE
			estado_guia_id = '00' AND
			oficina_id = $3 AND
			empresa_id = $4 AND
			usuario_id = $5
		ORDER BY
			serie DESC,numero DESC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT
			count(guia_remision_remitente_id)
		FROM
			pca_guias.vw_guias_remision_remitente
		WHERE
			estado_guia_id = '00' AND
			oficina_id = $3 AND
			empresa_id = $4 AND
			usuario_id = $5;
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_guias.fn_get_list_guia_remision_remitente_borrador(integer,--start $1
										  integer,--limit $2
										  varchar,--oficina_id $3
										  varchar,--empresa_id $4
										  varchar,--usuario_id $5
										  varchar[]--filtros $6
										  )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
	sqlfiltro varchar;
	sqlcount varchar;
BEGIN
	$6 := $6 || ARRAY[['string','eq','00','estado_guia_id'],['string','eq',$3,'oficina_id'],['string','eq',$4,'empresa_id'],['string','eq',$5,'usuario_id']]::varchar[];
	
	sqlfiltro := 
		'SELECT
			guia_remision_remitente_id,
			sesion_id,
			usuario_id,
			oficina_id,
			empresa_id,
			serie,
			numero,
			strserienumero,
			comprobante_id,
			fecha_traslado,
			fecha_hora_sistema,
			num_doc_identidad_destinatario,
			nombre_destinatario,
			punto_partida,
			punto_llegada,
			motivo_traslado,
			num_doc_identidad_transportista,
			nombre_transportista,
			marca_placa,
			licencia_conducir,
			estado_guia_id,
			precios_incluyen_igv,
			val_igv,
			moneda_id,
			moneda,
			moneda_siglas,
			importe_bruto,
			descuento,
			valor_venta,
			impuesto,
			precio_venta,
			tipo_cambio_emision,
			observaciones,
			imprimir_precios
		FROM
			pca_guias.vw_guias_remision_remitente
		WHERE '|| pca_global.fn_get_strfiltro($6) ||
		' ORDER BY
			serie DESC,numero DESC LIMIT '|| $2 || ' OFFSET '|| $1;
			
	sqlcount :=
		'SELECT
			count(guia_remision_remitente_id)
		FROM
			pca_guias.vw_guias_remision_remitente
		WHERE '|| pca_global.fn_get_strfiltro($6);

	OPEN cursor_result FOR
		EXECUTE(sqlfiltro);
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		EXECUTE(sqlcount);
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

--------------------------------------Consultar activos------------------------------------------------

CREATE OR REPLACE FUNCTION pca_guias.fn_get_list_guia_remision_remitente_activos(integer,--start $1
										 integer,--limit $2
										 varchar,--oficina_id $3
										 varchar --empresa_id $4
										 )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			guia_remision_remitente_id,
			sesion_id,
			usuario_id,
			oficina_id,
			empresa_id,
			serie,
			numero,
			strserienumero,
			comprobante_id,
			fecha_traslado,
			fecha_hora_sistema,
			num_doc_identidad_destinatario,
			nombre_destinatario,
			punto_partida,
			punto_llegada,
			motivo_traslado,
			num_doc_identidad_transportista,
			nombre_transportista,
			marca_placa,
			licencia_conducir,
			estado_guia_id,
			precios_incluyen_igv,
			val_igv,
			moneda_id,
			moneda,
			moneda_siglas,
			importe_bruto,
			descuento,
			valor_venta,
			impuesto,
			precio_venta,
			tipo_cambio_emision,
			observaciones,
			imprimir_precios
		FROM
			pca_guias.vw_guias_remision_remitente
		WHERE
			estado_guia_id <> '00' AND
			estado_guia_id <> '02' AND
			oficina_id = $3 AND
			empresa_id = $4
		ORDER BY
			serie DESC,numero DESC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT
			count(guia_remision_remitente_id)
		FROM
			pca_guias.vw_guias_remision_remitente
		WHERE
			estado_guia_id <> '00' AND
			estado_guia_id <> '02' AND
			oficina_id = $3 AND
			empresa_id = $4;
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_guias.fn_get_list_guia_remision_remitente_activos(integer,--start $1
										 integer,--limit $2
										 varchar,--oficina_id $3
										 varchar,--empresa_id $4
										 varchar[]--filtros $5
										 )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
	sqlfiltro varchar;
	sqlcount varchar;
BEGIN
	$5 := $5 || ARRAY[['string','df','00','estado_guia_id'],['string','df','02','estado_guia_id'],['string','eq',$3,'oficina_id'],['string','eq',$4,'empresa_id']]::varchar[];

	sqlfiltro := 
		'SELECT
			guia_remision_remitente_id,
			sesion_id,
			usuario_id,
			oficina_id,
			empresa_id,
			serie,
			numero,
			strserienumero,
			comprobante_id,
			fecha_traslado,
			fecha_hora_sistema,
			num_doc_identidad_destinatario,
			nombre_destinatario,
			punto_partida,
			punto_llegada,
			motivo_traslado,
			num_doc_identidad_transportista,
			nombre_transportista,
			marca_placa,
			licencia_conducir,
			estado_guia_id,
			precios_incluyen_igv,
			val_igv,
			moneda_id,
			moneda,
			moneda_siglas,
			importe_bruto,
			descuento,
			valor_venta,
			impuesto,
			precio_venta,
			tipo_cambio_emision,
			observaciones,
			imprimir_precios
		FROM
			pca_guias.vw_guias_remision_remitente
		WHERE '|| pca_global.fn_get_strfiltro($5) ||
		' ORDER BY
			serie DESC,numero DESC LIMIT '|| $2 || ' OFFSET '|| $1;
			
	sqlcount :=
		'SELECT
			count(guia_remision_remitente_id)
		FROM
			pca_guias.vw_guias_remision_remitente
		WHERE '|| pca_global.fn_get_strfiltro($5);

	OPEN cursor_result FOR
		EXECUTE(sqlfiltro);
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		EXECUTE(sqlcount);
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

--------------------------------------Consultar eliminados------------------------------------------------

CREATE OR REPLACE FUNCTION pca_guias.fn_get_list_guia_remision_remitente_eliminados(integer,--start $1
										    integer,--limit $2
										    varchar,--oficina_id $3
										    varchar --empresa_id $4
										    )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			guia_remision_remitente_id,
			sesion_id,
			usuario_id,
			oficina_id,
			empresa_id,
			serie,
			numero,
			strserienumero,
			comprobante_id,
			fecha_traslado,
			fecha_hora_sistema,
			num_doc_identidad_destinatario,
			nombre_destinatario,
			punto_partida,
			punto_llegada,
			motivo_traslado,
			num_doc_identidad_transportista,
			nombre_transportista,
			marca_placa,
			licencia_conducir,
			estado_guia_id,
			precios_incluyen_igv,
			val_igv,
			moneda_id,
			moneda,
			moneda_siglas,
			importe_bruto,
			descuento,
			valor_venta,
			impuesto,
			precio_venta,
			tipo_cambio_emision,
			observaciones,
			imprimir_precios
		FROM
			pca_guias.vw_guias_remision_remitente
		WHERE
			estado_guia_id = '02' AND
			oficina_id = $3 AND
			empresa_id = $4
		ORDER BY
			serie DESC,numero DESC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT
			count(guia_remision_remitente_id)
		FROM
			pca_guias.vw_guias_remision_remitente
		WHERE
			estado_guia_id = '02' AND
			oficina_id = $3 AND
			empresa_id = $4;
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_guias.fn_get_list_guia_remision_remitente_eliminados(integer,--start $1
										    integer,--limit $2
										    varchar,--oficina_id $3
										    varchar,--empresa_id $4
										    varchar[]--filtros $5
										    )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
	sqlfiltro varchar;
	sqlcount varchar;
BEGIN
	$5 := $5 || ARRAY[['string','eq','02','estado_guia_id'],['string','eq',$3,'oficina_id'],['string','eq',$4,'empresa_id']]::varchar[];
	sqlfiltro := 
		'SELECT
			guia_remision_remitente_id,
			sesion_id,
			usuario_id,
			oficina_id,
			empresa_id,
			serie,
			numero,
			strserienumero,
			comprobante_id,
			fecha_traslado,
			fecha_hora_sistema,
			num_doc_identidad_destinatario,
			nombre_destinatario,
			punto_partida,
			punto_llegada,
			motivo_traslado,
			num_doc_identidad_transportista,
			nombre_transportista,
			marca_placa,
			licencia_conducir,
			estado_guia_id,
			precios_incluyen_igv,
			val_igv,
			moneda_id,
			moneda,
			moneda_siglas,
			importe_bruto,
			descuento,
			valor_venta,
			impuesto,
			precio_venta,
			tipo_cambio_emision,
			observaciones,
			imprimir_precios
		FROM
			pca_guias.vw_guias_remision_remitente
		WHERE '|| pca_global.fn_get_strfiltro($5) ||
		' ORDER BY
			serie DESC,numero DESC LIMIT '|| $2 || ' OFFSET '|| $1;
			
	sqlcount :=
		'SELECT
			count(guia_remision_remitente_id)
		FROM
			pca_guias.vw_guias_remision_remitente
		WHERE '|| pca_global.fn_get_strfiltro($5);

	OPEN cursor_result FOR
		EXECUTE(sqlfiltro);
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		EXECUTE(sqlcount);
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

----------------------------------------------------------------------------------------------------------
-------------------------------pca_guias.detalles_guias_remision_remitente--------------------------------
----------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_guias.fn_add_detalle_guia_remision_remitente(bigint,--sesion_id $1
									     bigint,--guia_remision_remitente_id $2
									     bigint,--articulo_id $3
									     varchar,--codigo $4
									     numeric,--cantidad $5
									     varchar,--medida $6
									     varchar,--peso $7
									     text,--descripcion $8
									     numeric,--precio_unitario $9
									     numeric --precio_costo $10
									     )RETURNS bigint AS
$$
DECLARE
	_row pca_guias.guias_remision_remitente%ROWTYPE;
	_importe_bruto pca_guias.guias_remision_remitente.importe_bruto%TYPE;
	_descuento pca_guias.guias_remision_remitente.descuento%TYPE;
	_valor_venta pca_guias.guias_remision_remitente.valor_venta%TYPE;
	_impuesto pca_guias.guias_remision_remitente.impuesto%TYPE;
	_precio_venta pca_guias.guias_remision_remitente.precio_venta%TYPE;

	_precio_total pca_guias.detalles_guias_remision_remitente.precio_total%TYPE;
BEGIN
	SELECT
		*
	INTO
		_row
	FROM
		pca_guias.guias_remision_remitente
	WHERE
		guia_remision_remitente_id = $2;

	IF(FOUND)THEN
		_precio_total = $5 * $9; --calculamos el total para el detalle = cantidad * precio_unitario
	
		_descuento := _row.descuento;
		_importe_bruto := _row.importe_bruto + _precio_total;

		IF(_row.precios_incluyen_igv)THEN
			_precio_venta := _importe_bruto - _descuento;
			_valor_venta := _precio_venta / (1+ (_row.val_igv/100));
		ELSE
			_valor_venta := _importe_bruto - _descuento;
			_precio_venta := _valor_venta * (1+ (_row.val_igv/100));
		END IF;
		
		_impuesto :=  _precio_venta - _valor_venta;

		UPDATE pca_guias.guias_remision_remitente SET
			importe_bruto = _importe_bruto,
			valor_venta = _valor_venta,
			impuesto = _impuesto,
			precio_venta = _precio_venta
		WHERE
			guia_remision_remitente_id = $2;

		INSERT INTO pca_guias.detalles_guias_remision_remitente
			(sesion_id,
			guia_remision_remitente_id,
			articulo_id,
			codigo,
			cantidad,
			medida,
			peso,
			descripcion,
			precio_unitario,
			precio_costo,
			precio_total)
		VALUES
			($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,_precio_total);

		RETURN pca_global.fn_pseudo_encrypt_bigint(currval('pca_guias.seq_detalle_guia_remision_remitente_id')::integer);
	ELSE
		RAISE EXCEPTION 'No existe guia remision remitente con ID = %',$2;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_guias.fn_update_detalle_guia_remision_remitente(bigint,--detalle_id $1
									       bigint,--sesion_id $2
									       bigint,--guia_remision_remitente_id $3
									       bigint,--articulo_id $4
									       varchar,--codigo $5
									       numeric,--cantidad $6
									       varchar,--medida $7
									       varchar,--peso $8
									       text,--descripcion $9
									       numeric,--precio_unitario $10
									       numeric --precio_costo $11
									       )RETURNS void AS
$$
DECLARE
	_row pca_guias.guias_remision_remitente%ROWTYPE;
	_rowdetalle pca_guias.detalles_guias_remision_remitente%ROWTYPE;
	_importe_bruto pca_guias.guias_remision_remitente.importe_bruto%TYPE;
	_descuento pca_guias.guias_remision_remitente.descuento%TYPE;
	_valor_venta pca_guias.guias_remision_remitente.valor_venta%TYPE;
	_impuesto pca_guias.guias_remision_remitente.impuesto%TYPE;
	_precio_venta pca_guias.guias_remision_remitente.precio_venta%TYPE;

	_precio_total pca_guias.detalles_guias_remision_remitente.precio_total%TYPE;
BEGIN
	SELECT
		*
	INTO
		_rowdetalle
	FROM
		pca_guias.detalles_guias_remision_remitente
	WHERE
		detalle_id = $1;

	IF(FOUND)THEN
		SELECT
			*
		INTO
			_row
		FROM
			pca_guias.guias_remision_remitente
		WHERE
			guia_remision_remitente_id = $3;
			
		IF(FOUND)THEN
			_precio_total = $6 * $10; --calculamos el total para el detalle = cantidad * precio_unitario
		
			_descuento := _row.descuento;
			_importe_bruto := (_row.importe_bruto - _rowdetalle.precio_total) + _precio_total;

			IF(_row.precios_incluyen_igv)THEN
				_precio_venta := _importe_bruto - _descuento;
				_valor_venta := _precio_venta / (1+ (_row.val_igv/100));
			ELSE
				_valor_venta := _importe_bruto - _descuento;
				_precio_venta := _valor_venta * (1+ (_row.val_igv/100));
			END IF;
		
			_impuesto :=  _precio_venta - _valor_venta;

			UPDATE pca_guias.guias_remision_remitente SET
				importe_bruto = _importe_bruto,
				valor_venta = _valor_venta,
				impuesto = _impuesto,
				precio_venta = _precio_venta
			WHERE
				guia_remision_remitente_id = $3;

			UPDATE pca_guias.detalles_guias_remision_remitente SET
				sesion_id = $2,
				guia_remision_remitente_id = $3,
				articulo_id = $4,
				codigo = $5,
				cantidad = $6,
				medida = $7,
				peso = $8,
				descripcion = $9,
				precio_unitario = $10,
				precio_costo = $11,
				precio_total = _precio_total
			WHERE
				detalle_id = $1;
		ELSE
			RAISE EXCEPTION 'No existe guia remision remitente con ID = %',$3;
		END IF;
	ELSE
		RAISE EXCEPTION 'No existe detalle con ID = %',$1;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_guias.fn_del_detalle_guia_remision_remitente(bigint --detalle_id $1
								 )RETURNS void AS
$$
DECLARE
	_row pca_guias.guias_remision_remitente%ROWTYPE;
	_rowdetalle pca_guias.detalles_guias_remision_remitente%ROWTYPE;
	_importe_bruto pca_guias.guias_remision_remitente.importe_bruto%TYPE;
	_descuento pca_guias.guias_remision_remitente.descuento%TYPE;
	_valor_venta pca_guias.guias_remision_remitente.valor_venta%TYPE;
	_impuesto pca_guias.guias_remision_remitente.impuesto%TYPE;
	_precio_venta pca_guias.guias_remision_remitente.precio_venta%TYPE;
BEGIN
	SELECT
		*
	INTO
		_rowdetalle
	FROM
		pca_guias.detalles_guias_remision_remitente
	WHERE
		detalle_id = $1;

	IF(FOUND)THEN
		SELECT
			*
		INTO
			_row
		FROM
			pca_guias.guias_remision_remitente
		WHERE
			guia_remision_remitente_id = _rowdetalle.guia_remision_remitente_id;
			
		IF(FOUND)THEN
			_descuento := _row.descuento;
			_importe_bruto := (_row.importe_bruto - _rowdetalle.precio_total);

			IF(_row.precios_incluyen_igv)THEN
				_precio_venta := _importe_bruto - _descuento;
				_valor_venta := _precio_venta / (1+ (_row.val_igv/100));
			ELSE
				_valor_venta := _importe_bruto - _descuento;
				_precio_venta := _valor_venta * (1+ (_row.val_igv/100));
			END IF;
		
			_impuesto :=  _precio_venta - _valor_venta;

			UPDATE pca_guias.guias_remision_remitente SET
				importe_bruto = _importe_bruto,
				valor_venta = _valor_venta,
				impuesto = _impuesto,
				precio_venta = _precio_venta
			WHERE
				guia_remision_remitente_id = _rowdetalle.guia_remision_remitente_id;

			DELETE FROM pca_guias.detalles_guias_remision_remitente WHERE detalle_id = $1;
		ELSE
			RAISE EXCEPTION 'Error al consultar informacion de la guia remision remitente';
		END IF;
	ELSE
		RAISE EXCEPTION 'No existe detalle con ID = %',$1;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_guias.fn_move_down_detalle_guia_remision_remitente(bigint --detalle_id $1
										   )RETURNS void AS
$$
DECLARE
	_row pca_guias.detalles_guias_remision_remitente%ROWTYPE;
BEGIN
	SELECT
		*
	INTO
		_row
	FROM
		pca_guias.detalles_guias_remision_remitente
	WHERE
		detalle_id = $1;

	IF(FOUND)THEN
		UPDATE pca_guias.detalles_guias_remision_remitente SET correlativo = _row.correlativo WHERE correlativo = (_row.correlativo + 1) AND guia_remision_remitente_id = _row.guia_remision_remitente_id;
		UPDATE pca_guias.detalles_guias_remision_remitente SET correlativo = _row.correlativo + 1 WHERE detalle_id = $1;
	ELSE
		RAISE EXCEPTION 'No existe detalle con ID = %',$1;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_guias.fn_move_up_detalle_guia_remision_remitente(bigint --detalle_id $1
							 )RETURNS void AS
$$
DECLARE
	_row pca_guias.detalles_guias_remision_remitente%ROWTYPE;
BEGIN
	SELECT
		*
	INTO
		_row
	FROM
		pca_guias.detalles_guias_remision_remitente
	WHERE
		detalle_id = $1;

	IF(FOUND)THEN
		UPDATE pca_guias.detalles_guias_remision_remitente SET correlativo = _row.correlativo WHERE correlativo = (_row.correlativo-1) AND guia_remision_remitente_id = _row.guia_remision_remitente_id;
		UPDATE pca_guias.detalles_guias_remision_remitente SET correlativo = _row.correlativo -1 WHERE detalle_id = $1;
	ELSE
		RAISE EXCEPTION 'No existe detalle con ID = %',$1;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_guias.fn_get_list_detalle_guia_remision_remitente(bigint --guia_remision_remitente_id $1
										 )RETURNS SETOF pca_guias.detalles_guias_remision_remitente AS
$$
DECLARE
	_row pca_guias.detalles_guias_remision_remitente%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			detalle_id,
			sesion_id,
			guia_remision_remitente_id,
			correlativo,
			articulo_id,
			codigo,
			cantidad,
			medida,
			peso,
			descripcion,
			precio_unitario,
			precio_costo,
			precio_total
		FROM
			pca_guias.detalles_guias_remision_remitente
		WHERE
			guia_remision_remitente_id = $1
		ORDER BY
			correlativo ASC
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;